﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CLM.Gestao.Interfaces;
using CLM.Gestao.Administrador.DAL;

namespace CLM.Gestao.Administrador.BLL
{
    public class CategoriaCentroCusto : CategoriaCentroCustoBLO<TB_CATEGORIA_CENTRO_CUSTO>
    {
        #region Propriedades

        public int IdCategoriaCentroCusto { get; set; }
        public string NomeCategoriaCentroCusto { get; set; }

        #endregion Propriedades

        #region Conversões

        private List<TB_CATEGORIA_CENTRO_CUSTO> ConvertToEDM(List<Lista> pLista)
        {
            List<TB_CATEGORIA_CENTRO_CUSTO> List = (from l in pLista
                                                    select new TB_CATEGORIA_CENTRO_CUSTO
                                     {
                                         ID_CATEGORIA_CENTRO_CUSTO = l.IdCategoriaCentroCusto,
                                         NOME_CATEGORIA_CENTRO_CUSTO = l.NomeCategoriaCentroCusto
                                     }).ToList();
            return List;
        }

        private List<Lista> ConvertToContext(IQueryable<TB_CATEGORIA_CENTRO_CUSTO> pContext)
        {
            List<Lista> List = (from l in pContext
                                select new Lista
                                {
                                    IdCategoriaCentroCusto = l.ID_CATEGORIA_CENTRO_CUSTO,
                                    NomeCategoriaCentroCusto = l.NOME_CATEGORIA_CENTRO_CUSTO,
                                    IdIndicadorDespesa = l.ID_INDICADOR_DESPESA
                                }).ToList();
            return List;
        }

        #endregion Conversões

        #region CRUD

        /// <summary>
        /// Adiciona
        /// </summary>
        /// <param name="pLista">pLista</param>
        public void Add(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Add(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Deleta
        /// </summary>
        /// <param name="pLista">pLista</param>
        public void Delete(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Delete(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Atualiza
        /// </summary>
        /// <param name="pLista">pLista</param>
        public void Update(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Update(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Efetua a pesquisa na tabela, filtrando as solicitações do usuário
        /// </summary>
        /// <param name="pPesquisa">pPesquisa</param>
        /// <returns>Lista</returns>
        private IQueryable<TB_CATEGORIA_CENTRO_CUSTO> Get(Lista pPesquisa)
        {
            IQueryable<TB_CATEGORIA_CENTRO_CUSTO> Consulta;

            Consulta = from p in GetAll()
                       select p;
            if (pPesquisa != null)
            {
                if (!string.IsNullOrWhiteSpace(pPesquisa.NomeCategoriaCentroCusto))
                    Consulta = from p in Consulta where p.NOME_CATEGORIA_CENTRO_CUSTO.Contains(pPesquisa.NomeCategoriaCentroCusto) select p;

                if (pPesquisa.IdIndicadorDespesa != null)
                    Consulta = from p in Consulta where p.ID_INDICADOR_DESPESA == pPesquisa.IdIndicadorDespesa select p;

                if (pPesquisa.IndicaIndicadorDespesa != null)
                    Consulta = from p in Consulta where p.ID_INDICADOR_DESPESA == null select p;

            
            }
            return Consulta;
        }

        #endregion CRUD

        #region Retorna Listas e Itens

        public List<Lista> GetLista()
        {
            return GetLista(new Lista());
        }

        public List<Lista> GetLista(Lista pPesquisa)
        {
            var ListaUsuario = ConvertToContext(Get(pPesquisa));
            return ListaUsuario;
        }

        public List<Itens> GetItens()
        {
            return GetItens(new Lista());
        }

        public List<Itens> GetItens(Lista pPesquisa)
        {
            List<Itens> ListaUsuario = (from p in Get(pPesquisa)
                                        select new Itens()
                                        {
                                            IdCategoriaCentroCusto = p.ID_CATEGORIA_CENTRO_CUSTO,
                                            NomeCategoriaCentroCusto = p.NOME_CATEGORIA_CENTRO_CUSTO
                                        }).ToList();
            return ListaUsuario;
        }

        #endregion Retorna Listas e Itens

        #region Consultas

        
        #endregion Consultas

        #region Classes

        /// <summary>
        /// Preenche o combobox
        /// </summary>
        public class Itens
        {
            public int IdCategoriaCentroCusto { get; set; }
            public string NomeCategoriaCentroCusto { get; set; }

        }

        /// <summary>
        /// Lista com as propriedades da classe
        /// </summary>
        public class Lista
        {
            public int IdCategoriaCentroCusto { get; set; }
            public string NomeCategoriaCentroCusto { get; set; }
            public int? IdIndicadorDespesa { get; set; }
            public bool? IndicaIndicadorDespesa { get; set; }
        }

        #endregion Classes
    }

    #region Classe CategoriaCentroCustoBLO

    public class CategoriaCentroCustoBLO<T> : IBLO<T> where T : TB_CATEGORIA_CENTRO_CUSTO
    {
        private CategoriaCentroCustoDAO<T> _base = new CategoriaCentroCustoDAO<T>();


        public T Add(T pEntity)
        {
            Validate(pEntity);
            _base.Add(pEntity);
            return _base.Save(pEntity);

        }

        public T Save(T pEntity)
        {
            Validate(pEntity);
            return _base.Save(pEntity);
        }

        public void Delete(T pEntity)
        {
            _base.Delete(pEntity);
            _base.Save(pEntity);

        }

        public T Update(T pEntity)
        {
            Validate(pEntity);
            _base.Update(pEntity);
            return _base.Save(pEntity);
        }

        public IQueryable<T> GetAll()
        {
            return _base.GetAll();
        }

        public void Validate(T pEntity)
        {
            throw new NotImplementedException();
        }
    }

    #endregion
}
